package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.ControlestextoDAO;
import py.com.alfa.escriba.persistence.dto.ControlestextoDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.ControlestextoService;

public class ControlestextoServiceImpl implements ControlestextoService{

  private ControlestextoDAO controlestextoDAO;

  public void setControlestextoDAO(ControlestextoDAO controlestextoDAO) {
    this.controlestextoDAO = controlestextoDAO;
  }

  @Override
  public List<ControlestextoDTO> listControlestexto(InvocationContext ic) throws ServiceException {
    List<ControlestextoDTO> controlestextos =  controlestextoDAO.listControlestexto();
    return controlestextos;
  }
  
  @Override
  public List<ControlestextoDTO> listControlestextoByIdControl(Long id, InvocationContext ic) throws ServiceException {
	if (id == null || id <= 0)
	      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");
	
    List<ControlestextoDTO> controlestextos =  controlestextoDAO.listControlestextoByIdControl(id);
    return controlestextos;
  }

  @Override
  public ControlestextoDTO getControlestexto(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlestextoDTO controlestexto =  controlestextoDAO.getControlestextoById(id);

    if (controlestexto == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlestexto.notfound", id);

    return controlestexto;
  }

  @Override
  public void deleteControlestexto(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlestextoDTO controlestexto =  controlestextoDAO.getControlestextoById(id);

    if(controlestexto == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlestexto.notfound", id);

    try {
      controlestextoDAO.deleteControlestexto(controlestexto);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "controlestexto.constraint.violation", id);
    }

  }

  @Override
  public ControlestextoDTO updateControlestexto(Long id, ControlestextoDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    ControlestextoDTO controlestexto = controlestextoDAO.getControlestextoById(id);

    if (controlestexto == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlestexto.notfound", id);

    controlestexto.setIdcontrol(dto.getIdcontrol());
    controlestexto.setIdescribano(dto.getIdescribano());
    controlestexto.setIdtemplate(dto.getIdtemplate());
    controlestexto.setTexto(dto.getTexto());
 

    Utils.validarDTO(controlestexto);

    controlestextoDAO.updateControlestexto(controlestexto);

    return controlestexto;
  }

  @Override
  public ControlestextoDTO createControlestexto(ControlestextoDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);

      controlestextoDAO.createControlestexto(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "controlestexto.duplicate.key");
    }

    return dto;
  }

}